package Principal;

import Implementacion.Juego;
import Implementaciones.Conjunto;
import Interfaces.Ficha;
import Interfaces.IJuego;
import TDA.ConjuntoTDA;

public class Principal {

	public static void main(final String[] args) {
		titular();
		try {
			final ConjuntoTDA<Ficha> fichas = fabricarFichas();
			final IJuego juego = crearJuego(args);
			if (juego != null) correr(juego, fichas);
		} catch (Exception e) {
			System.err.println(e.getMessage());
		}
		firmarPorAutores();
	}

	private static void titular() {
		System.out.println("_________________________________________");
		System.out.println("|    Solucionador de Pentominó  v1.0    |");
		System.out.println("");
	}

	private static void firmarPorAutores() {
		System.out.println("_________________________________________");
		System.out.println("|  Díaz - Elizalde - Palumbo - Viviani  |");
		System.out.println("UADE - Programación III - TPO - 2do. 2012");
	}

	private static void correr(
			final IJuego juego,
			final ConjuntoTDA<Ficha> fichas) {
		System.out.print("Calculando... ");
		long tiempo = System.currentTimeMillis();
		boolean resultado = juego.rompecabeza2D(fichas);
		tiempo = System.currentTimeMillis() - tiempo;
		if (resultado) {
			System.out.println("Se pudo armar el rompecabezas.\n");
			juego.imprimirTablero();
		} else {
			System.out.println("No se pudo armar el rompecabezas!");
		}
		System.out.println("Tiempo computando la solución: " 
				+ tiempo + "ms.");
	}

	private static IJuego crearJuego(final String[] args) {
		IJuego juego = null;
		int dimension = -1;
		if (args.length > 0) {
			try {
				dimension = Integer.valueOf(args[0]);
			} catch (NumberFormatException e) {
				System.out.println("El argumento no es un numero. Saliendo.-");
				return null;
			}
		} else {
			System.out.println("Usando dimension por default.");
		}
		juego = (dimension < 0 ? new Juego() : new Juego(dimension));
		return juego;
	}

	static ConjuntoTDA<Ficha> fabricarFichas() {
		final ConjuntoTDA<Ficha> fichas = new Conjunto<Ficha>();
		fichas.inicializarConjunto();
		
		Ficha f = new Ficha("F", 3, 3);
		f.setearValor(0, 1, true);
		f.setearValor(0, 2, true);
		f.setearValor(1, 0, true);
		f.setearValor(1, 1, true);
		f.setearValor(2, 1, true);
		fichas.agregar(f);
		
		f = new Ficha("I", 1, 5);
		f.setearValor(0, 0, true);
		f.setearValor(0, 1, true);
		f.setearValor(0, 2, true);
		f.setearValor(0, 3, true);
		f.setearValor(0, 4, true);
		fichas.agregar(f);
		
		f = new Ficha("X", 3, 3);
		f.setearValor(0, 1, true);
		f.setearValor(1, 0, true);
		f.setearValor(1, 1, true);
		f.setearValor(1, 2, true);
		f.setearValor(2, 1, true);
		fichas.agregar(f);
		
		f = new Ficha("L", 2, 4);
		f.setearValor(0, 0, true);
		f.setearValor(0, 1, true);
		f.setearValor(0, 2, true);
		f.setearValor(0, 3, true);
		f.setearValor(1, 3, true);
		fichas.agregar(f);
		
		f = new Ficha("N", 2, 4);
		f.setearValor(1, 0, true);
		f.setearValor(0, 1, true);
		f.setearValor(1, 1, true);
		f.setearValor(0, 2, true);
		f.setearValor(0, 3, true);
		fichas.agregar(f);
		
		f = new Ficha("P", 2, 3);
		f.setearValor(1, 0, true);
		f.setearValor(0, 1, true);
		f.setearValor(1, 1, true);
		f.setearValor(0, 2, true);
		f.setearValor(1, 2, true);
		fichas.agregar(f);
		
		f = new Ficha("T", 3, 3);
		f.setearValor(0, 0, true);
		f.setearValor(1, 0, true);
		f.setearValor(2, 0, true);
		f.setearValor(1, 1, true);
		f.setearValor(1, 2, true);
		fichas.agregar(f);
		
		f = new Ficha("U", 3, 2);
		f.setearValor(0, 0, true);
		f.setearValor(2, 0, true);
		f.setearValor(0, 1, true);
		f.setearValor(1, 1, true);
		f.setearValor(2, 1, true);
		fichas.agregar(f);
		
		f = new Ficha("V", 3, 3);
		f.setearValor(0, 0, true);
		f.setearValor(0, 1, true);
		f.setearValor(0, 2, true);
		f.setearValor(1, 2, true);
		f.setearValor(2, 2, true);
		fichas.agregar(f);
		
		f = new Ficha("W", 3, 3);
		f.setearValor(0, 0, true);
		f.setearValor(0, 1, true);
		f.setearValor(1, 1, true);
		f.setearValor(1, 2, true);
		f.setearValor(2, 2, true);
		fichas.agregar(f);
		
		f = new Ficha("Y", 2, 4);
		f.setearValor(1, 0, true);
		f.setearValor(0, 1, true);
		f.setearValor(1, 1, true);
		f.setearValor(1, 2, true);
		f.setearValor(1, 3, true);
		fichas.agregar(f);
		
		f = new Ficha("Z", 3, 3);
		f.setearValor(0, 0, true);
		f.setearValor(1, 0, true);
		f.setearValor(1, 1, true);
		f.setearValor(1, 2, true);
		f.setearValor(2, 2, true);
		fichas.agregar(f);
		
		return fichas;
	}
}
